home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / fdimg / —‹Œêsrc.lzh / ctrlx.c < prev    next >
C/C++ Source or Header  |  1993-03-03  |  29KB  |  1,375 lines

  1. #include    "3DDEF.H"
  2. #include    "GLOBAL.H"
  3. #include    "FORWARD.H"
  4. #include    "XCODE.H"
  5.  
  6. extern UWORD view_flag;
  7.  
  8. /* 終了 */
  9. void
  10. ctrl_x_ctrl_c()
  11. {
  12.     if (etc_check_changed()) {    /* 変更を受けている */
  13.         while(1) {
  14.             UBYTE c;
  15.  
  16.             under_print0((STR)"本当に終了しますか [Y/N]? ");
  17.             fep_key_clear();
  18.             c = toupper(fep_inkey_raw());
  19.             if (c == 'Y') {
  20.                 break;
  21.             } else if (c == 'N') {
  22.                 return;
  23.             }
  24.         }
  25.     }
  26.     init_exit();
  27.     etc_exit(0);
  28. }
  29.  
  30. /* ファイル読み込み(バッファチェンジ) */
  31. void
  32. ctrl_x_ctrl_f()
  33. {
  34.     UBYTE filename[MAXLINE];
  35.     UBYTE w[MAXLINE];
  36.  
  37.     line_seigyou();
  38. #if 1
  39.     mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  40. #endif
  41.     sprintf((char *) w,"ファイル読み込み [%s]: ",etc_ret_current_path());
  42.     if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  43.         under_print((STR)"[中断]");
  44.         return;
  45.     }
  46.     ctrl_x_ctrl_f1(filename);
  47. }
  48.  
  49. void
  50. ctrl_x_ctrl_f1(STR filename)
  51. {
  52.     int f,t;
  53.  
  54.     if ((f = file_search(filename)) >= 0) {
  55.         under_print((STR)"[既に存在します]");
  56.         if (!CMDMOD) {    /* ME モードである */
  57.             t = etc_text_search(f);
  58.             if (t<0) error("見付かりません1");
  59.             window_set_text(CWN,t);
  60.             window_set_current(CWN);
  61. /*            window_change(CWN);*/
  62.             window_change00(CWN);
  63.             disp_btm_line(CWN);
  64.             meta_ctrl_l();
  65.         }
  66.         return;
  67.     }
  68.     ctrl_x_ctrl_f0(filename);
  69. }
  70.  
  71. void
  72. ctrl_x_ctrl_f1_alway(STR filename)
  73. {
  74.     int f,t;
  75.  
  76.     if ((f = file_search(filename)) >= 0) {
  77.         t = etc_text_search(f);
  78.         if (t<0) {
  79.             error("見付かりません2");
  80.         }
  81.         window_set_text(CWN,t);
  82.         window_set_current(CWN);
  83.         window_change00(CWN);
  84.         disp_btm_line(CWN);
  85.         meta_ctrl_l();
  86.         return;
  87.     }
  88.     ctrl_x_ctrl_f0(filename);
  89. }
  90.  
  91. void
  92. ctrl_x_ctrl_f0(STR filename)
  93. {
  94.     int flag;
  95.     int t,f;
  96.  
  97.     if ((t = window_get_free_text_number()) < 0) {    /* 開いたテキストがない */
  98.         etc_inp_y((STR)"扱うテキストの数が多すぎます。中断します [Y]?");
  99.         return;
  100.     }
  101.     if ((f = file_get_free_number()) < 0) {    /* 開いたファイルがない */
  102.         etc_inp_y((STR)"扱うファイルの数が多すぎます。中断します [Y]?");
  103.         return;
  104.     }
  105.  
  106.     flag = file_open(f,filename);
  107.             /* 指定されたファイルをオープンし、指定されたファイル番号とする */
  108.     if (flag < 0) {
  109.         error("ファイルをオープンできません");
  110.     }
  111. /* とりあえず New file ということで、カーソルは先頭 */
  112.     file_set_text(f,t);
  113.  
  114.     window_set_text(CWN,t);    /* 今のウインドウに新しいテキストを割り当てる */
  115.     window_set_current(CWN);
  116.     init_current_screen();
  117.     buff_read_file();    /* カレントファイルをカレントバッファに読み込む */
  118.     file_close(f);
  119.     disp_btm_line(CWN);
  120.     under_blanc();
  121. }
  122.  
  123. /* ファイル読み込み(挿入) */
  124. /* 行単位である */
  125. /* CL の前に挿入する */
  126. /* 挿入後 CL は変わらず */
  127. void
  128. ctrl_x_ctrl_i()
  129. {
  130.     int t,f;
  131.     int flag;
  132.     UBYTE filename[MAXLINE];
  133.     UBYTE w[MAXLINE];
  134.     int lc = 0;
  135.     FILE *fp;
  136.  
  137.     line_seigyou();
  138.  
  139.     sprintf((char *) w,"ファイル挿入 [%s]: ",etc_ret_current_path());
  140.     if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  141.         under_print((STR)"[中断]");
  142.         return;
  143.     }
  144.  
  145.     fp = fopen((char *)filename,"rb");
  146.     if (!fp) {
  147.         under_print((STR)"[ファイルが存在しません]");
  148.         return;
  149.     }
  150.  
  151.     change_check();
  152.     init_skip_cnf(fp,w);
  153.     under_print((STR)"[ファイル挿入中]");
  154.     lc = buff_read_file_ins(fp,w,CL);    /* ファイルをカレントバッファに挿入する */
  155.     disp_cl_y(CY);
  156.     fclose(fp);
  157.     sprintf((char *)w,"[挿入 %d 行]",lc);
  158.     under_print(w);
  159. }
  160.  
  161. /* 指定範囲を小文字へ */
  162. void
  163. ctrl_x_ctrl_l()
  164. {
  165.     UNIT *lp;
  166.     int lbp;
  167.  
  168.     if (ctrl_x_get_mark(&lp,&lbp)) {
  169.         ctrl_x_ctrl_lu_sub(lp,lbp,CL,ANALYZE[CPX].BPOS,etc_tolower);
  170.         under_blanc();
  171.     }
  172. }
  173.  
  174. /* 指定範囲を大文字へ */
  175. void
  176. ctrl_x_ctrl_u()
  177. {
  178.     UNIT *lp;
  179.     int lbp;
  180.  
  181.     if (ctrl_x_get_mark(&lp,&lbp)) {
  182.         ctrl_x_ctrl_lu_sub(lp,lbp,CL,ANALYZE[CPX].BPOS,etc_toupper);
  183.         under_blanc();
  184.     }
  185. }
  186.  
  187. void
  188. ctrl_x_ctrl_lu_sub(UNIT *lp,int lbp,UNIT *rp,int rbp,UINT (*func)())
  189. {
  190.     UNIT *wp;
  191.     register int wb,nb;
  192.     int x0=0;
  193.     UBYTE w[VERY_LONG_LINE*4];
  194.     register STR pp;
  195.     register UINT c,c0;
  196.     register int flag;
  197.  
  198.     etc_line_order(&lp,&lbp,&rp,&rbp);
  199.     line_get_body(w,wp = lp);
  200.     wb = lbp;
  201.     flag = 0;
  202.     while((wp != rp) || (wb < rbp)) {
  203.         pp =line_skip_xcode(&w[wb]);
  204.         if (c0 = (*pp)) {    /* 行末ではない */
  205.             if (iskanji(c0)) {
  206.                 c0 = (c0 << 8) | (UBYTE)pp[1];
  207.                 c = (*func)(c0);
  208.                 if (c != c0) {
  209.                     *pp = (c >> 8) & 0xff;
  210.                     pp[1] = c & 0xff;
  211.                     flag = 1;
  212.                 }
  213.             } else {
  214.                 c = (*func)(c0);
  215.                 if (c != c0) {
  216.                     *pp = c;
  217.                     flag = 1;
  218.                 }
  219.             }
  220.         }
  221.         nb = line_touch_next_char_x(w,wb,&x0);
  222.         if (nb == wb) {
  223.             line_store_and_echo(wp,w);    /* 納める */
  224.             line_get_body(w,wp = wp->ATO);    /* 次の行へ */
  225.             flag = wb = 0;    /* 行頭から */
  226.         } else {
  227.             wb = nb;    /* 次の文字へ */
  228.         }
  229.     }
  230.     if (flag) {
  231.         line_store_and_echo(wp,w);    /* 納める */
  232.         change_check();
  233.     }
  234.     line_cl_cl();
  235.     work_line_analyze();
  236. }
  237.  
  238. /* 見つからなかったら 0 を返す */
  239. int
  240. ctrl_x_get_mark(UNIT **p,int *bp)
  241. {
  242.     UBYTE w[MAXLINE];
  243.     register int a;
  244.     int b;
  245.     register UNIT *wp;
  246.  
  247.     if ((a = etc_get_arg()) >= MAX_MARK) {
  248.         under_print((STR)"マーク番号が不適当です");
  249.         return(0);
  250.     }
  251.  
  252.     line_seigyou();
  253.     if (wp = mark_get_mark(a,&b)) {
  254.         *p = wp;
  255.         *bp = b;
  256.         return(1);
  257.     } else {
  258.         UBYTE w[MAXLINE];
  259.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  260.         under_print(w);
  261.         return(0);
  262.     }
  263. }
  264.  
  265. /* 上へ1行貼り付きスクロール */
  266. void
  267. ctrl_x_ctrl_n()
  268. {
  269.     register UNIT *newline;
  270.  
  271.     line_seigyou();
  272.     if (CY) {    /* カーソルは一番上ではない */
  273.         newline = disp_scroll_up1();
  274.         CY--;
  275.     } else {    /* カーソルは一番上であった */
  276.             /* 1行スクロールして、カーソルはセンターへ */
  277.         UNIT *wp;
  278.  
  279.         if ((wp = CL->ATO) != TAIL) {    /* 後がある */
  280.             newline = disp_scroll_up1();
  281.             CL = line_trace(wp,(CWY1-CWY0)/2,&CY);
  282.             line_cl_cl();
  283.             work_line_analyze();
  284.              CX0 = CPX = 0;
  285.             work_cursor_cpx();
  286.         } else {
  287.             /* 何もしない */
  288.             return;
  289.         }
  290.     }
  291.     /* 一番下の行を書く */
  292.  
  293.     if (newline) {
  294.         newline = newline->ATO;
  295.     }
  296.     disp_1line(CWY1,newline);
  297. }
  298.  
  299. /* 下へ1行貼り付きスクロール */
  300. void
  301. ctrl_x_ctrl_p()
  302. {
  303.     UNIT *wp;
  304.  
  305.     line_seigyou();
  306.     if ((wp = (line_my_top())->MAE) != HEAD) {    /* 一番上の前がある */
  307.         if (CY != CWY1) {    /* カーソルは一番下ではない */
  308.             disp_scroll_dn1();
  309.             CY++;
  310.         } else {    /* カーソルは一番下であった */
  311.                 /* 1行スクロールして、カーソルはセンターへ */
  312.             disp_scroll_dn1();
  313.             disp_1line(CWY0,wp);
  314.             CL = line_trace(wp,(CWY1-CWY0)/2,&CY);
  315.             line_cl_cl();
  316.             work_line_analyze();
  317.             CX0 = CPX = 0;
  318.             work_cursor_cpx();
  319.         }
  320.         /* 一番上の行を書く */
  321.         disp_1line(CWY0,wp);
  322.     } else {
  323.         /* 何もしない */
  324.         return;
  325.     }
  326. }
  327.  
  328. /* 情報無しセーブ */
  329. void
  330. ctrl_x_ctrl_s()
  331. {
  332. /*    line_seigyou();*/
  333.     if (CURRENT_CHANGED) {
  334.         if (buff_save_file(0,NIL,NIL,NULL)) {
  335.             /* 成功した */
  336.             CURRENT_CHANGED = 0;
  337.             disp_btm_changed_erase_x(CURRENT_TEXT);
  338.         }
  339.     } else {
  340.         under_blanc();
  341.     }
  342. }
  343.  
  344. /* カーソル位置とマーク交換 */
  345. void
  346. ctrl_x_ctrl_x()
  347. {
  348.     UNIT *wp;
  349.     int a,bp,y;
  350.  
  351.     if ((a = etc_get_arg()) >= MAX_MARK) {
  352.         under_print((UBYTE *)"マーク番号が不適当です");
  353.         return;
  354.     }
  355.  
  356.     if (wp = mark_get_mark(a,&bp)) {    /* マークが存在した */
  357.         if ((CL == wp) && (ANALYZE[CPX].XPOS < bp)) {
  358.             /* 同じ行で、カーソルよりも右側にマークがある */
  359.             bp += 2;    /* 次のセットマークで3バイトずれる予定 */
  360.         }
  361.         mark_set_mark(a);
  362.         CL = wp;
  363.         line_cl_cl();
  364.         if ((y = window_is_this_line_in_current(CL)) < 0) {    /* 入ってない */
  365.             line_seigyou();
  366.             disp_cl_center();
  367.         } else {
  368.             CY = y;
  369.         }
  370.         work_line_analyze();
  371.         CPX = work_byte_to_CPX(bp);
  372.         CX0 = CX = ANALYZE[CPX].XPOS;
  373.         under_blanc();
  374.         work_cursor_cpx();
  375.     } else {                /* マークが存在しない */
  376.         UBYTE w[MAXLINE];
  377.         sprintf((char *) w,"マーク %1d は設定されていません",a);
  378.         under_print(w);
  379.     }
  380. }
  381.  
  382. /* (デフォルトが)前バッファ */
  383. void
  384. ctrl_x_b()
  385. {
  386.     ctrl_x_b0(0);    /* 尋ねる */
  387. }
  388.  
  389. /* flag=1 で無条件実行 */
  390. #if 0
  391. /* まえバッファ */
  392. void
  393. ctrl_x_b0(int flag)
  394. {
  395.     register int t;
  396.  
  397.     t = CURRENT_TEXT;
  398.     while(1) {
  399.         t--;
  400.         if (t < 0) {
  401.             t = MAX_TEXT - 1;
  402.         }
  403.         if (TDATA[t].TEXT_FILE != -1) {        /* 次のが見つかった */
  404.             if (t != CURRENT_TEXT) {    /* カレントとは違うテキストである */
  405.                 window_set_text(CWN,t);
  406.                 window_set_current(CWN);
  407.                 window_change00(CWN);
  408.                 disp_btm_line(CWN);
  409.                 meta_ctrl_l();
  410.                 return;
  411.             }
  412.             break;
  413.         }
  414.     }
  415.     return;
  416. }
  417. #else
  418. void
  419. ctrl_x_b0(int flag)
  420. {
  421.     register int t,f;
  422.     STR p;
  423.  
  424.     t = CURRENT_TEXT;
  425.     while(1) {
  426.         t--;
  427.         if (t < 0 ) {
  428.             t = MAX_TEXT-1;
  429.         }
  430.         if (TDATA[t].TEXT_FILE != -1) {        /* 前のが見つかった */
  431.             if (t != CURRENT_TEXT) {    /* カレントとは違うテキストである */
  432.                 UBYTE w[MAXLINE],s[MAXLINE];
  433.  
  434.                 sprintf((char *)w,"バッファ[%s]: ",( p = FILE_NAMES[t].CONTENT));
  435.                 if (flag) {
  436.                     *s = EOS;
  437.                 } else {
  438.                     if (under_input_cr_raw(w,s) < -1) {
  439.                         under_print("[中断]");
  440.                         break;    /* 無効なので何もしない */
  441.                     }
  442.                 }
  443.  
  444.                 if (*s) {    /* 何か指定された */
  445.                     if ((f = file_search(s)) < 0) {    /* 新しく作る */
  446.                         ctrl_x_ctrl_f0(p);
  447.                         break;
  448.                     }
  449.  
  450.                     t = etc_text_search(f);
  451.                     if (t == CURRENT_TEXT) {
  452.                             /* カレントと同じだから何もしない */
  453.                         break;
  454.                     }
  455.                 }
  456.                 window_set_text(CWN,t);
  457.                 window_set_current(CWN);
  458.                 window_change00(CWN);
  459.                 disp_btm_line(CWN);
  460.                 meta_ctrl_l();
  461.             } else {
  462.                 under_print("前バッファは存在しません");
  463.             }
  464.             break;
  465.         }
  466.     }
  467. }
  468. #endif
  469.  
  470. /* カラムを変更する */
  471. void
  472. ctrl_x_f()
  473. {
  474.     UBYTE w[MAXLINE];
  475.     register int a;
  476.  
  477.     if (!(a = etc_get_arg())) {    /* ARG == 0 */
  478.         sprintf((char *) w,"アーギュメントにカラム数を設定して下さい");
  479.         under_print(w);
  480.         return;
  481.     }
  482.     if (!((COLUMN_MIN <= a) && (a <= COLUMN_MAX))) {
  483.         sprintf((char *) w,"カラムの設定は %d から %d までです",COLUMN_MIN,COLUMN_MAX);
  484.         under_print(w);
  485.         return;
  486.     }
  487.  
  488.     if (a == CURRENT_JIZUME) {    /* 字詰めが同じ */
  489.         under_print((STR)"カラムの設定が同じです");
  490.         return;
  491.     }
  492.  
  493.     /* 変更する */
  494.     ctrl_x_f0(a);
  495.     change_check();
  496. }
  497.  
  498. void
  499. ctrl_x_f0(int a)
  500. {
  501.     UNIT *wp;
  502.     UBYTE wlist[MAX_WINDOW];    /* フラグ用 */
  503.     int bp,y,cwn0;
  504.     register int i;
  505.  
  506.     under_print((STR)"カラム変更:作業中・・・");
  507.     line_seigyou();
  508.     CURRENT_JIZUME = a;
  509.     mark_set_mark(XCODE_SYSMARK - XCODE_MARK + CWN);    /* システムマーク */
  510.  
  511.     window_which_has_text_number(CURRENT_TEXT,wlist);
  512.  
  513.     wp = HEAD->ATO;    /* 先頭行 */
  514.     line_arrange_all(wp);
  515.     wp = mark_get_mark(XCODE_SYSMARK - XCODE_MARK + CWN,&bp);
  516.     mark_erase_mark(XCODE_SYSMARK - XCODE_MARK + CWN);    /* システムマークを消す */
  517.     CL = wp;
  518.     line_cl_cl();
  519.     disp_cl_center();
  520.     cwn0 = CWN;    /* 保存 */
  521.     for(i = 0;i < MAX_WINDOW;i++) {
  522.         if ((i != cwn0) && (wlist[i])) {
  523.             window_change0(i);
  524.             disp_cl_center();
  525.         }
  526.     }
  527.     window_change0(cwn0);    /* 戻す */
  528.  
  529.     work_line_analyze();
  530.     CPX = work_byte_to_CPX(bp);
  531.     CX0 = CX = ANALYZE[CPX].XPOS;
  532.     under_blanc();
  533.     work_cursor_cpx();
  534. }
  535.  
  536. /* 現在のバッファを削除する */
  537. /* 削除されたウインドウは次バッファに移動する */
  538. void
  539. ctrl_x_k()
  540. {
  541.     ctrl_x_k0(0);
  542. }
  543.  
  544. /* 現在のバッファを削除する */
  545. /* 削除されたウインドウは次バッファに移動する */
  546. /* 移動したら1を返す */
  547. /* flag=1 で無条件実行 */
  548. int
  549. ctrl_x_k0(int flag)
  550. {
  551.     UBYTE w[MAXLINE],s[MAXLINE];
  552.     register int t,td,fd,i;
  553.     int cw;
  554.  
  555.     td = CURRENT_TEXT;    /* デフォルト */
  556.  
  557.     if (flag) {
  558.         fd = TDATA[td].TEXT_FILE;
  559.     } else {
  560.         sprintf((char *)w,"バッファ削除[%s]: ",FILE_NAMES[CURRENT_TEXT].CONTENT);
  561.         if (under_input_cr_raw(w,s) == -2) {    /* ^G である */
  562.             etc_beep();
  563.             under_print((STR)"[中断]");
  564.             return(0);
  565.         }
  566.         if (*s) {    /* 何か指定された */
  567.             if ((fd = file_search(s)) < 0) {    /* そんなバッファは無い */
  568.                 return(0);
  569.             }
  570.             td = etc_text_search(fd);
  571.         } else {
  572.             fd = TDATA[td].TEXT_FILE;
  573.         }
  574.     }
  575.  
  576.     /* td を削除する */
  577.     /* このテキストをあつかってるすべてのウインドウについて */
  578.  
  579.     t = td;
  580.     while(1) {
  581.         t++;
  582.         if (t >= MAX_TEXT) {
  583.             t = 0;
  584.         }
  585.         if (TDATA[t].TEXT_FILE != -1) {    /* 次である */
  586.             break;
  587.         }
  588.     }
  589.     if (t != td) {    /* テキストが2つ以上存在する */
  590.         if (TDATA[td].CHANGED_FLAG) {
  591.             while(1) {
  592.                 UBYTE c;
  593.  
  594.                 under_print0((STR)"変更点を破棄しますか [Y/N]? ");
  595.                 fep_key_clear();
  596.                 c = toupper(fep_inkey_raw());
  597.                 if (c == 'Y') {
  598.                     break;
  599.                 } else if (c == 'N') {
  600.                     return;
  601.                 }
  602.             }
  603.         }
  604.         cw = CWN;    /* 保存 */
  605.         /* td -> t とする */
  606.         for(i=0;i<MAX_WINDOW;i++) {
  607.             if (WDATA[i].WTEXTS == td) {
  608. /*
  609.                 window_set_text(i,t);
  610.                 window_change(i);
  611.                 ctrl_x_ctrl_f1_alway(FILE_NAMES[t].CONTENT);
  612. */
  613.  
  614.                 window_set_text(i,t);
  615.                 window_set_current(i);
  616.                 window_change00(i);
  617.                 ctrl_x_ctrl_f1_alway(FILE_NAMES_ST[t].CONTENT);
  618.                 disp_btm_line(i);
  619.             }
  620.         }
  621.         meta_ctrl_l();
  622.         ctrl_l();
  623.         CWN = cw;
  624.         window_set_text(CWN,t);
  625.         window_set_current(CWN);
  626.         window_change00(CWN);
  627.         disp_cl_center();
  628.         line_deleten(&TDATA[td].TEXT_HEADS,&TDATA[td].TEXT_TAILS);
  629.         TDATA[td].TEXT_FILE = -1;
  630.         *(FILE_NAMES[fd].CONTENT) = *(FILE_NAMES_ST[fd].CONTENT) = EOS;
  631.         main_set_view_flag();
  632.         return(1);
  633.     } else {
  634.         return(0);
  635.     }
  636. }
  637.  
  638. /* 次バッファ */
  639. void
  640. ctrl_x_x()
  641. {
  642.     ctrl_x_x0();
  643. }
  644.  
  645. /* 次バッファ */
  646. /* 移動したら1を返す */
  647. int
  648. ctrl_x_x0()
  649. {
  650.     register int t;
  651.  
  652.     t = CURRENT_TEXT;
  653.     while(1) {
  654.         t++;
  655.         if (t >= MAX_TEXT) {
  656.             t = 0;
  657.         }
  658.         if (TDATA[t].TEXT_FILE != -1) {        /* 次のが見つかった */
  659.             if (t != CURRENT_TEXT) {    /* カレントとは違うテキストである */
  660.                 line_seigyou();
  661.                 mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  662.                 window_set_text(CWN,t);
  663.                 window_set_current(CWN);
  664.                 window_change00(CWN);
  665.                 disp_btm_line(CWN);
  666.                 meta_ctrl_l();
  667.                 return(1);
  668.             }
  669.             break;
  670.         }
  671.     }
  672.     return(0);
  673. }
  674.  
  675. /* ウインドウ縮小 */
  676. /* 一番下のウインドウなら、上のボトムを下げる */
  677. /* それ以外なら、ボトムを上へ */
  678. void
  679. ctrl_x_ctrl_z()
  680. {
  681.     ctrl_x_w_sub(CWY1-CWY0);
  682. }
  683.  
  684. /* レポート */
  685. void
  686. ctrl_x_equal()
  687. {
  688.     UBYTE w[MAXLINE];
  689.     register int lc = 0;
  690.     register int bs = 0;
  691.     register UNIT *p;
  692.     int cc,bc,r,ll;
  693.     int page0,page00,page1;
  694.  
  695.     p = HEAD->ATO;
  696.     while(p != TAIL) {
  697.         lc++;
  698.         if (p == CL) {
  699.             cc = lc;
  700.             bc = bs;
  701.         }
  702.         bs += p->LENGTH;
  703.         p = p->ATO;
  704.     }
  705.     bc += ANALYZE[CPX].BPOS;
  706.  
  707.     {
  708.         register int i = 0;
  709.         register int x;
  710.  
  711.         while(1) {
  712.             x = ANALYZE[i].XPOS;
  713.             if (i && (x == 0)) {        /* 行が短い */
  714.                 ll = i-1;
  715.                 break;
  716.             }
  717.             i++;
  718.         }
  719.     }
  720.  
  721.     if (PAGE == 0) {
  722.         page00 = page0 = 1;    /* PAGE が 0 になっているなら、常に1頁目 */
  723.         page1 = cc;
  724.     } else {
  725.         page00 = (lc / PAGE) + 1;    /* 総頁 */
  726.         page0 = ((cc-1) / PAGE) + 1;    /* 現頁 */
  727.         page1 = ((cc-1) % PAGE) + 1;    /* 現行 */
  728.     }
  729.     sprintf((char *)w,"%d/%d 行 %d/%d頁の%d行目 %d/%d 桁 文字数 %d/%d (%d%c) 文字= 0x%X",
  730.     cc,lc,page0,page00,page1,ANALYZE[CPX].XPOS,ANALYZE[ll].XPOS,
  731.     bc,bs,(bs)? bc*100/bs:0,'%',line_cpx_code());
  732.     under_print(w);
  733. }
  734.  
  735. /* ウインドウ拡大 */
  736. /* 一番下のウインドウなら、上のウインドウのボトムを上げる */
  737. /* それ以外なら、ボトムを下へ */
  738. void
  739. ctrl_x_up_arrow()
  740. {
  741.     ctrl_x_w_sub(CWY1-CWY0+2);
  742. }
  743.  
  744. /* 現在のウインドウを消す */
  745. /* 上のウインドウを拡張する */
  746. /* 上にウインドウがなければ下を拡張する */
  747. void
  748. ctrl_x_0()
  749. {
  750.     register int i,y;
  751.     UNIT *wp;
  752.     int cwn0,sbottom,stop;
  753.  
  754.     line_seigyou();
  755.     if (!(sbottom = WDATA[CWN].WY0)) {        /* 一番上のウインドウであった */
  756.         if ((stop = WDATA[CWN].WY1 + 2) == UNDER_Y) {    /* 一番下のウインドウであった */
  757.             under_print((STR)"このウインドウは削除出来ません");
  758.             return;
  759.         } else {        /* 下にウインドウがある */
  760.             cwn0 = CWN;
  761.             for(i=0;i<MAX_WINDOW;i++) {
  762.                 if (WDATA[i].WY0 == stop) {    /* このウインドウに行く */
  763.                     window_change(i);
  764.                     y = CWY0+CY;
  765.                     wp = line_my_screen(0);    /* カレントの一番上の行 */
  766.     window_change_size(CWN,WDATA[cwn0].WX0,WDATA[cwn0].WY0,-1,-1);
  767.                     disp_btm_line(CWN);
  768.                     disp_cl_y(y);
  769.                     /* 前のウインドウを閉める */
  770.                     window_set_size(cwn0,-1,-1,-1,-1);
  771.                     window_set_position(cwn0,0,0,0);/* カーソル位置の設定 */
  772.                     window_set_text(cwn0,-1);
  773.                     break;
  774.                 }
  775.             }
  776.         }
  777.     } else {            /* 上にウインドウがある */
  778.         cwn0 = CWN;
  779.         for(i=0;i<MAX_WINDOW;i++) {
  780.             if ((stop = WDATA[i].WY1 + 2) == sbottom) {
  781.             /* 現在のウインドウ削除し、このウインドウにする */
  782.                 window_change(i);
  783.                 y = CWY0+CY;
  784.                 wp = line_my_screen(0);    /* カレントの一番上の行 */
  785.                 window_change_size(CWN,-1,-1,WDATA[cwn0].WX1,WDATA[cwn0].WY1);
  786.                 disp_btm_line(CWN);
  787.                 disp_cl_y(y);
  788.                 /* 前のウインドウを閉める */
  789.                 window_set_size(cwn0,-1,-1,-1,-1);
  790.                 window_set_position(cwn0,0,0,0);/* カーソル位置の設定 */
  791.                 window_set_text(cwn0,-1);
  792.                 break;
  793.             }
  794.          }
  795.     }
  796.     ctrl_l();
  797. }
  798.  
  799. /* 現在以外のウインドウを消す */
  800. void
  801. ctrl_x_1()
  802. {
  803.     UNIT *wp;
  804.     register int y,i;
  805.  
  806.     line_seigyou();
  807.     y = CWY0+CY;
  808.     wp = line_my_screen(0);            /* カレントの一番上の行 */
  809.     window_change_size(CWN,0,0,XWIDTH-1,YWIDTH-3);    /* カレントをフルサイズに */
  810.     disp_cl_y(y);
  811.     for(i=0;i<MAX_WINDOW;i++) {
  812.         if (i != CWN) {
  813.             window_set_size(i,-1,-1,-1,-1);
  814.             window_set_position(i,0,0,0);    /* カーソル位置の設定 */
  815.             window_set_text(i,-1);
  816.         }
  817.     }
  818.     disp_btm_line(CWN);
  819. }
  820.  
  821. /* 現在のウインドウを2分割 */
  822. /* 2分割より上ならカーソルは上のウインドウに */
  823. /* 2分割より下ならカーソルは下のウインドウに */
  824. /* ちょうどボトムラインだったなら、上へ1行貼り付きスクロール(^X^N)する */
  825. void
  826. ctrl_x_2()
  827. {
  828.     if (ctrl_x_20() >= 0) {
  829.         ctrl_l();
  830.     }
  831. }
  832.  
  833. /* 新しく作ったウインドウの番号を返す */
  834. /* さもなくば-1 */
  835. int
  836. ctrl_x_20()
  837. {
  838.     int y,y0,fw,c;
  839.     UNIT *top;
  840.     UNIT *wp;
  841.  
  842.     if ((y = CWY1-CWY0) < 2) {    /* 分割できない */
  843.         UBYTE w[MAXLINE];
  844.         sprintf((char *) w,"%1d 行のウインドウは分割出来ません",y+1);
  845.         under_print(w);
  846.         return(-1);
  847.     }
  848.     if ((y /= 2) == CY) {
  849.         ctrl_x_ctrl_n();    /* 分割点がカーソルの上なら上に張り付きスクロール */
  850.     }    /* CY changed */
  851.  
  852.     if ((fw = window_get_free_window_number()) < 0) {    /* 無い */
  853.         UBYTE w[MAXLINE];
  854.         sprintf((char *) w,"ウインドウの数は %d までです",MAX_WINDOW);
  855.         under_print(w);
  856.         return(-1);
  857.     }
  858.  
  859.     line_seigyou();
  860.     if (CY < y) {    /* カーソルは上に行く */
  861.         top = line_my_top();
  862.         c = CWN;
  863.     } else {    /* カーソルは下に行く */
  864.         top = line_my_screen(y+1);
  865.         CY -= y+1;
  866.         c = fw;
  867.     }
  868.     window_dup_window(CWN,fw);        /* サイズを複写する */
  869.  
  870. /* カーソルが下に行く場合に、一瞬上に'==='が出てしまう・・・ */
  871.     y0 = CWY0;
  872.     window_change_size(CWN,-1,-1,-1,y0+y-1);    /* 上の大きさ */
  873.     window_change_size(fw,-1,y0+y+1,-1,-1);        /* 下の大きさ */
  874.  
  875.     disp_window_top_flush(CWN,top);
  876.     disp_window_top_flush(fw,top);
  877.     /* カーソルの絶対位置は変わらない */
  878.     if (c != CWN) {
  879.         int c0;
  880.  
  881.         c0 = CWN;
  882.         mark_set_mark(XCODE_SYSMARK-XCODE_MARK+c);    /* システムマーク */
  883.         window_change(c);
  884.         return(c0);
  885.     } else {
  886.         mark_set_mark(XCODE_SYSMARK-XCODE_MARK+fw);    /* システムマーク */
  887.         return(fw);
  888.     }
  889. }
  890.  
  891. /* ファイル名を変える */
  892. void
  893. ctrl_x_n()
  894. {
  895.     UBYTE fname[MAXLINE],w[MAXLINE];
  896.     register int i;
  897.  
  898.     sprintf((char *) w,"ファイル名変更 [%s]: ",etc_ret_current_path());
  899.     if (under_input_cr_raw(w,fname) < 0) {    /* 無効であった = ^G */
  900.         under_print((STR)"[中断]");
  901.         return;
  902.     }
  903.     strcpy(FILE_NAMES[CURRENT_TEXT].CONTENT,fname);
  904.     etc_name_to_full(FILE_NAMES[CURRENT_TEXT].CONTENT);
  905.     strcpy(FILE_NAMES_ST[CURRENT_TEXT].CONTENT,fname);
  906.     FILE_POINTERS[CURRENT_TEXT] = NULL_FP;
  907.     /* このテキストをあつかってるすべてのウインドウについても! */
  908.     for(i=0;i<MAX_WINDOW;i++) {
  909.         if (WDATA[i].WTEXTS == CURRENT_TEXT) {
  910.             disp_btm_line(i);
  911.         }
  912.     }
  913.     main_set_view_flag();
  914.     if (!view_flag) {
  915.         change_check();
  916.     }
  917. }
  918.  
  919. /* 次(下)ウインドウ */
  920. void
  921. ctrl_x_o()
  922. {
  923.     register int i,stop;
  924.  
  925.     line_seigyou();
  926.     if ((stop = WDATA[CWN].WY1 + 2) == UNDER_Y) {    /* 一番下のウインドウであった */
  927.         stop = 0;
  928.     }
  929.     for(i=0;i<MAX_WINDOW;i++) {
  930.         if ((WDATA[i].WY0 == stop) && (i != CWN)) {    /* このウインドウに行く */
  931.             mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  932.             window_set_current(i);/* ,,, */
  933.             window_change00(i);
  934.             window_change(i);
  935. /*            disp_btm_line(i);*/
  936. /*
  937. window0();
  938. printf("[%d]",CY);binkey();
  939. CL = line_my_screen(CY);
  940. line_cl_cl();
  941. */
  942.             ctrl_l();
  943.             break;
  944.         }
  945.     }
  946.     etc_while_fep_qxf();
  947. }
  948.  
  949. /* 前ウインドウ */
  950. void
  951. ctrl_x_p()/* ,,, */
  952. {
  953.     register int i,sbottom;
  954.  
  955.     line_seigyou();
  956.     if (!(sbottom = WDATA[CWN].WY0)) {    /* 一番上のウインドウであった */
  957.         sbottom = UNDER_Y;
  958.     }
  959.     for(i=0;i<MAX_WINDOW;i++) {
  960.         if (((WDATA[i].WY1 + 2) == sbottom) && (i != CWN)) {    /* このウインドウに行く */
  961.             mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  962.             window_set_current(i);/* ,,, */
  963.             window_change00(i);
  964.             window_change(i);
  965.             ctrl_l();
  966.             break;
  967.         }
  968.     }
  969. /*error("見つかってない");*/
  970. }
  971.  
  972. /* ウインドウの行数設定 */
  973. void
  974. ctrl_x_w()
  975. {
  976.     int a;
  977.  
  978.     if (!(a = etc_get_arg())) {    /* アーギュメントがない */
  979.         under_print((STR)"ウインドウの行数設定ができません");
  980.         return;
  981.     }
  982.     ctrl_x_w_sub(a);
  983. }
  984.  
  985. /* カレントウインドウの行数を a にする */
  986. void
  987. ctrl_x_w_sub(int a)
  988. {
  989.     register int i,wy;
  990.  
  991.     mark_set_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  992.     if ((wy = CWY1 + 2) == UNDER_Y) {    /* 一番下のウインドウであった */
  993.         wy = CWY0 - 2;
  994.         for(i=0;i<MAX_WINDOW;i++) {    /* 上のウインドウを捜す */
  995.             if (WDATA[i].WY1 == wy) {
  996.                 break;
  997.             }
  998.         }
  999.         if (!window_2_change_size(i,CWN,(CWY1-CWY0+1)-a)) {    /* 変更しなかった */
  1000.             under_print((STR)"ウインドウの行数変更ができません");
  1001.         } else {
  1002.             ctrl_l();
  1003.             under_blanc();
  1004.         }
  1005.     } else {
  1006.         for(i=0;i<MAX_WINDOW;i++) {    /* 下のウインドウを捜す */
  1007.             if (WDATA[i].WY0 == wy) {
  1008.                 break;
  1009.             }
  1010.         }
  1011.         if (!window_2_change_size(CWN,i,a-(CWY1-CWY0+1))) {    /* 変更しなかった */
  1012.             under_print((STR)"ウインドウの行数変更ができません");
  1013.         } else {
  1014.             ctrl_l();
  1015.             under_blanc();
  1016.         }
  1017.     }
  1018.     mark_erase_mark(XCODE_SYSMARK-XCODE_MARK+CWN);    /* システムマーク */
  1019. }
  1020.  
  1021. /* チャイルド(COMMAND.X) */
  1022. void
  1023. ctrl_x_gyo()
  1024. {
  1025.     int rc;
  1026.     UBYTE w[MAXLINE],cn[MAXLINE];
  1027.     UBYTE fep_func_save_tmp[712];    /* ファンクションキーの保存 */
  1028.     UINT mode;
  1029.  
  1030.     mode = K_SFTSNS();
  1031.     if (CMDMOD) {
  1032.         if ((rc = under_input_cr_raw((STR) "Human68k:",cn)) < 0) {    /* 無効であった = ^G */
  1033.             if (rc == -1) {
  1034.                 ctrl_x_c();
  1035.             } else {
  1036.                 under_print((STR)"[中断]");
  1037.             }
  1038.             fep_ledset(mode);
  1039.             return;
  1040.         }
  1041.     } else {
  1042.         if (under_input_cr_raw((STR) "! ",cn) < 0) {    /* 無効であった = ^G */
  1043.             under_print((STR)"[中断]");
  1044.             fep_ledset(mode);
  1045.             return;
  1046.         }
  1047.     }
  1048.     strcpy(w,"COMMAND.X /C ");
  1049.     strcat(w,cn);
  1050.     FNCKEYGT(0,fep_func_save_tmp);
  1051.     init_exit();
  1052. /*    fep_mode_set0((STR)"H--M");*/
  1053. /*    KNJCTRL(11,DIC_MODE);*/
  1054.  
  1055.     B_CLR_AL();
  1056.     if ((rc = etc_child(w)) < 0) {
  1057.         B_PRINT("実行出来ませんでした\n\n\r");
  1058.     }
  1059.     B_PRINT("[終了]");
  1060.     INPOUT(0xff);    /* おまじない */
  1061.     fep_inkey_raw();
  1062.     if (DUM_FLAG) {    /* ダミーモードである */
  1063.         KNJCTRL(7,1);
  1064.     } else {
  1065.         KNJCTRL(7,0);
  1066.     }
  1067.     FNCKEYST(0,fep_func_save_tmp);
  1068.     etc_func_on0();
  1069.     ctrl_l();
  1070.     fep_ledset(mode);
  1071. }
  1072.  
  1073. /* チャイルド(直接) */
  1074. void
  1075. ctrl_x_doller()
  1076. {
  1077.     int rc;
  1078.     UBYTE w[MAXLINE],cn[MAXLINE];
  1079.     UBYTE fep_func_save_tmp[712];    /* ファンクションキーの保存 */
  1080.     UINT mode;
  1081.  
  1082.     mode = K_SFTSNS();
  1083.     if (under_input_cr_raw((STR) "$ ",cn) < 0) {    /* 無効であった = ^G */
  1084.         under_print((STR)"[中断]");
  1085.         fep_ledset(mode);
  1086.         return;
  1087.     }
  1088.     FNCKEYGT(0,fep_func_save_tmp);
  1089.     init_exit();
  1090.     if ((rc = etc_child(cn)) < 0) {
  1091.         B_PRINT("実行出来ませんでした\n\n\r");
  1092.     }
  1093.     B_PRINT("[終了]");
  1094.     INPOUT(0xff);    /* おまじない */
  1095.     fep_inkey_raw();
  1096.     if (DUM_FLAG) {
  1097.         KNJCTRL(7,1);
  1098.     } else {
  1099.         KNJCTRL(7,0);
  1100.     }
  1101.     FNCKEYST(0,fep_func_save_tmp);
  1102.     etc_func_on0();
  1103.  
  1104.     ctrl_l();
  1105.     fep_ledset(mode);
  1106. }
  1107.  
  1108. /* マーク解除 */
  1109. void
  1110. ctrl_x_space()
  1111. {
  1112.     int a;
  1113.     UBYTE w[MAXLINE];
  1114.  
  1115.     if ((a = etc_get_arg()) <= MAX_MARK) {
  1116.         mark_erase_mark(a);
  1117.     }
  1118.     sprintf((char *) w,"[マーク %1d 解除]",a);
  1119.     under_print(w);
  1120. }
  1121.  
  1122. /* バッファの一覧 */
  1123. void
  1124. ctrl_x_ctrl_b()
  1125. {
  1126.     int f,t,wn,cwn0;
  1127.     UBYTE filename[MAXLINE];
  1128.     UBYTE w[MAXLINE];
  1129.     UBYTE wlist[MAX_WINDOW];    /* フラグ用 */
  1130.     UNIT *p;
  1131.  
  1132.     line_seigyou();
  1133.     cwn0 = CWN;
  1134.     if ((f = file_search((STR)"[List]")) >= 0) {    /* 既にある */
  1135.         UBYTE list[MAX_WINDOW];
  1136.         int i;
  1137.  
  1138.         t = etc_text_search(f);
  1139.         if (window_which_has_text_number(t,list)) {
  1140.                 /* ウインドウが存在する */
  1141.             for(i=0;i<MAX_WINDOW;i++) {
  1142.                 if (list[i]) {    /* 最初のウインドウで抜ける */
  1143.                     window_change(i);
  1144.                     break;
  1145.                 }
  1146.             }
  1147.         } else {    /* ウインドウが存在しない */
  1148.             if ((wn = ctrl_x_20()) < 0) {    /* 新しく作られたウインドウ */
  1149.                 /* できなかった */
  1150.                 return;
  1151.             }
  1152.             window_change(wn);
  1153.             ctrl_x_ctrl_f1_alway((STR)"[List]");
  1154.         }
  1155.     } else {    /* 新しくバッファを作る */
  1156.         if (window_get_free_text_number() < 0) {    /* 開いたテキストがない */
  1157.             etc_inp_y((STR)"扱うテキストの数が多すぎます。中断します [Y]?");
  1158.             return;
  1159.         }
  1160.         if ((wn = ctrl_x_20()) < 0) {    /* 新しく作られたウインドウ */
  1161.             /* できなかった */
  1162.             return;
  1163.         }
  1164.         window_change(wn);    /* カレントを移動する */
  1165.     }
  1166. /*    cwn0 = CWN;    *//* 保存 */
  1167.     /* wn にバッファリストを表示する */
  1168.     if (strcmp(FILE_NAMES_ST[WDATA[CWN].WTEXTS].CONTENT,"[List]")) {
  1169.         ctrl_x_ctrl_f0((STR)"[List]");
  1170.     } else if (HEAD->ATO != TAIL) {
  1171.         line_deleten_echo(HEAD,TAIL);
  1172.         buff_read_file_new();
  1173.     }
  1174.     ctrl_x_f0(COLUMN_MAX);
  1175.     CL= HEAD->ATO;
  1176.     line_store_and_echo(CL,(STR)"状態   行数  サイズ バッファ名                   ファイル名\n");
  1177.  
  1178.     line_cl_cl();
  1179.     CX = CX0 = CPX = 0;
  1180.     p = line_get_free_and_store_ck(
  1181. (STR)"----  -------- ------ ----------                      ----------\n");
  1182.     line_append1_echo(p);
  1183.     for(t=0;t<MAX_TEXT;t++) {
  1184.         UBYTE w[MAXLINE],w0[MAXLINE];
  1185.         register int l,lc;
  1186.         register UNIT *p,*pt;
  1187.         int j;
  1188.  
  1189.         if ((TDATA[t].TEXT_FILE >= 0) && (t != CURRENT_TEXT)) {
  1190.             p = (TDATA[t].TEXT_HEADS).ATO;
  1191.             pt = &TDATA[t].TEXT_TAILS;
  1192.             l = lc = 0;
  1193.             while(p != pt) {
  1194.                 lc++;
  1195.                 l += p->LENGTH;
  1196.                 p = p->ATO;
  1197.             }
  1198.  
  1199.             etc_get_pathname(w0,FILE_NAMES[t].CONTENT);
  1200.             sprintf((char *)w,"@%c%c.  %6d行 %6d %-32s%-s",
  1201.             (TDATA[t].CHANGED_FLAG) ?'*':'.',
  1202.             (TDATA[t].BAK_FLAG) ?'B':'.',
  1203.             lc,l,FILE_NAMES_ST[t].CONTENT,w0);
  1204.             strcat((char *)w,"\n");
  1205.             p = line_get_free_and_store_ck(w);
  1206.             line_append1_echo(p);
  1207.         }
  1208.     }
  1209.     window_change(cwn0);
  1210.     ctrl_l();
  1211. }
  1212.  
  1213. /* シェルを起動 */
  1214. void
  1215. ctrl_x_c()
  1216. {
  1217.     UBYTE fep_func_save_tmp[712];    /* ファンクションキーの保存 */
  1218.     UINT mode;
  1219.  
  1220.     mode = K_SFTSNS();
  1221.     fep_get_led0();
  1222.     FNCKEYGT(0,fep_func_save_tmp);
  1223.     init_exit();
  1224. /*    fep_mode_set0((STR)"H--M");*/
  1225.     B_CLR_AL();
  1226.     etc_child("COMMAND.X");
  1227. #if 1
  1228.     INPOUT(0xff);    /* おまじない */
  1229.     if (DUM_FLAG) {
  1230.         KNJCTRL(7,1);
  1231.     } else {
  1232.         KNJCTRL(7,0);
  1233.     }
  1234.     FNCKEYST(0,fep_func_save_tmp);
  1235.     etc_func_on0();
  1236.     ctrl_l();
  1237. #endif
  1238.     fep_follow_led0();
  1239.     fep_ledset(mode);
  1240. }
  1241.  
  1242. /* ファイル書き出し */
  1243. void
  1244. ctrl_x_ctrl_w()
  1245. {
  1246.     UBYTE filename[MAXLINE];
  1247.     UBYTE w[VERY_LONG_LINE*4];
  1248.     UNIT *wp;
  1249.     FILE *fp;
  1250.  
  1251.     line_seigyou();
  1252.     sprintf((char *) w,"ファイル書き出し [%s]: ",etc_ret_current_path());
  1253.     if (under_input_cr_raw(w,filename) < 0) {    /* 無効であった = ^G */
  1254.         under_print((STR)"[中断]");
  1255.         return;
  1256.     }
  1257.     buff_save_file(0,HEAD->ATO,NIL,filename);
  1258. }
  1259.  
  1260. /* CL の前後にある改行だけの行を削除する */
  1261. void
  1262. ctrl_x_ctrl_o()
  1263. {
  1264.     register UNIT *wp;
  1265.     UNIT *wp_mae,*wp_ato;
  1266.  
  1267.     line_seigyou();
  1268.     if (!etc_just_kaigyou(CL)) {
  1269.         return;
  1270.     }
  1271.  
  1272.     /* CL は改行だけのコードである */
  1273.     wp = wp_mae = wp_ato = CL;
  1274.     while(1) {
  1275.         if ((wp = wp->MAE) == HEAD) {
  1276.             break;
  1277.         }
  1278.         if (etc_just_kaigyou(wp)) {
  1279.             wp_mae = wp;
  1280.         } else {
  1281.             break;
  1282.         }
  1283.     }
  1284.  
  1285.     wp = CL;
  1286.     while(1) {
  1287.         if ((wp = wp->ATO) == TAIL) {
  1288.             break;
  1289.         }
  1290.         if (etc_just_kaigyou(wp)) {
  1291.             wp_ato = wp;
  1292.         } else {
  1293.             break;
  1294.         }
  1295.     }
  1296.  
  1297.     if (commander_is_last_cut_buff_type()) {
  1298.     } else {    /* でなければ、カットバッファをクリア */
  1299.         buff_clear_cut_buff();
  1300.     }
  1301.     change_check();
  1302.     if (wp_ato->ATO != TAIL) {
  1303.         wp_ato = wp_ato->ATO;
  1304.     }
  1305.     CL = wp_ato;
  1306.     line_cl_cl();
  1307.     work_line_analyze();
  1308.     CPX = CX0 = CX = 0;
  1309.     work_delete_to_cut_buff(wp_mae,0,CL,0);
  1310.  
  1311.     work_cursor_cpx();
  1312. }
  1313.  
  1314. void
  1315. ctrl_x_left_braket()
  1316. {
  1317.     if (MACRO_DEF_FLAG) {
  1318.         under_print("[マクロ記録中です]");
  1319.         MACRO_COUNT -= 2;
  1320.     } else {
  1321.         MACRO_DEF_FLAG = 1;
  1322.         MACRO_COUNT = 0;
  1323.         under_print("[マクロ記録開始]");
  1324.     }
  1325. }
  1326.  
  1327. void
  1328. ctrl_x_right_braket()
  1329. {
  1330.     if (MACRO_DEF_FLAG) {
  1331.         under_print("[マクロ記録終了]");
  1332.         if (MACRO_COUNT) {
  1333.             MACRO_SEQUENCE[MACRO_COUNT-2] = 0;    /* 自分を消す */
  1334.         } else {
  1335.             MACRO_SEQUENCE[0] = 0;
  1336.         }
  1337.         MACRO_COUNT = MACRO_DEF_FLAG = 0;
  1338.     } else {
  1339.         under_print("[マクロ記録中ではありません]");
  1340.     }
  1341. }
  1342.  
  1343. /* マクロ実行 */
  1344. void
  1345. ctrl_x_e()
  1346. {
  1347.     register int a;
  1348.  
  1349.     if (MACRO_DEF_FLAG) {
  1350.         MACRO_COUNT -= 2;
  1351.     } else {
  1352.         if (a = etc_get_arg()) {    /* 回数が指定された */
  1353.             MACRO_EXE_FLAG = a;
  1354.         } else {
  1355.             MACRO_EXE_FLAG = 1;
  1356.         }
  1357.         MACRO_COUNT = 0;
  1358.     }
  1359. }
  1360.  
  1361. /* 逆方向無条件置換 */
  1362. void
  1363. ctrl_x_r()
  1364. {
  1365.     meta_replace_r(1);
  1366. }
  1367.  
  1368. /* 逆方向確認置換 */
  1369. void
  1370. ctrl_x_ctrl_r()
  1371. {
  1372.     meta_replace_r(0);
  1373. }
  1374.  
  1375.